/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package editorsvg.css;

import editorsvg.editor.documento.ElementoSVG;

/**
 * Condición de descendiente.
 * Para seguir la cadena debe verificar la condición de que algun descendiente
 * cumpla las siguientes reglas.
 * @author Jorge Berjano
 */
public class CondicionDescendiente extends Condicion {
        
    private Condicion condicionAscendiente;
    private Condicion condicionDescendiente;

    public CondicionDescendiente(Condicion condicionAscendiente, Condicion condicionDescendiente) {
        this.condicionAscendiente = condicionAscendiente;
        this.condicionDescendiente = condicionDescendiente;
    }
    
    @Override
    public String toString() {
        return condicionDescendiente + " descendiente de " + condicionAscendiente;
    }
    
    @Override
    public boolean evaluar(ElementoSVG elemento, Regla regla) {
                
        if (condicionAscendiente == null) {
            return false;
        }
            
        if (!condicionAscendiente.evaluar(elemento, null)) {
            return false;
        }
        
        if (elemento.getHijos() == null) {            
            return false;
        }
        
        boolean cumple = false;
        for (ElementoSVG hijo : elemento.getHijos()) {
            cumple |= condicionDescendiente.evaluar(hijo, regla);
            cumple |= evaluar(hijo, regla);
        }
        return cumple;
    }

    @Override
    public int getEspecificidad() {
        return condicionAscendiente.getEspecificidad() + condicionDescendiente.getEspecificidad();
    }
}
